{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import panel as pn\n",
    "\n",
    "pn.extension('katex', 'mathjax')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `LaTeX` pane enables rendering LaTeX equations as HTML using either the [KaTeX](https://katex.org/) or [MathJax](https://www.mathjax.org) renderer.\n",
    "\n",
    "You must load the desired renderer manually (e.g., `pn.extension('katex')` or `pn.extension('mathjax')`). If both are loaded, KaTeX is used by default.\n",
    "\n",
    "Please note that both [KaTeX](https://katex.org/) and [MathJax](https://www.mathjax.org) support only a subset of the features available in a full LaTeX renderer. For detailed information on supported features, refer to their respective documentation.\n",
    "\n",
    "#### Parameters:\n",
    "\n",
    "For details on additional options for customizing the component, refer to the [layout](../../how_to/layout/index.md) and [styling](../../how_to/styling/index.md) how-to guides.\n",
    "\n",
    "* **`object`** (str or object): A string containing LaTeX code, an object with a `_repr_latex_` method, or a [SymPy](https://www.sympy.org/en/index.html) expression.\n",
    "* **`renderer`** (object): The current renderer; must be one of the available options.\n",
    "* **`styles`** (dict): A dictionary specifying CSS styles.\n",
    "\n",
    "___\n",
    "\n",
    "A `LaTeX` pane will render any object with a `_repr_latex_` method, [SymPy](https://www.sympy.org/en/index.html) expressions, or any string containing LaTeX. Any LaTeX content should be wrapped in `$...$` or `\\(...\\)` delimiters, for example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "latex = pn.pane.LaTeX(\n",
    "    r'The LaTeX pane supports two delimiters: $LaTeX$ and \\(LaTeX\\)', styles={'font-size': '18pt'}\n",
    ")\n",
    "\n",
    "latex"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Its important to prefix your LaTeX strings with an `r` to make the string a *raw* string and not escape the \\\\ character."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pn.Column(\n",
    "    pn.pane.LaTeX(\"$\\frac{1}{n}$\"), # Will not work\n",
    "    pn.pane.LaTeX(r\"$\\frac{1}{n}$\")\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The ``LaTeX`` pane can be updated like other panes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "latex.object = r'$\\sum_{j}{\\sum_{i}{a*w_{j, i}}}$'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lets change it back:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "latex.object = r'The LaTeX pane supports two delimiters: $LaTeX$ and \\(LaTeX\\)'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If both renderers have been loaded we can override the default renderer:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pn.pane.LaTeX(r'The LaTeX pane supports two delimiters: $LaTeX$ and \\(LaTeX\\)', renderer='mathjax', styles={'font-size': '18pt'})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And can also be composed like any other pane:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "maxwell = pn.pane.LaTeX(r\"\"\"\n",
    "$\\begin{aligned}\n",
    "  \\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\\n",
    "  \\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\\n",
    "  \\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\\n",
    "  \\nabla \\cdot \\vec{\\mathbf{B}} & = 0\n",
    "\\end{aligned}\n",
    "$\"\"\", styles={'font-size': '24pt'})\n",
    "\n",
    "cauchy_schwarz = pn.pane.LaTeX(object=r\"\"\"\n",
    "$\\left( \\sum_{k=1}^n a_k b_k \\right)^2 \\leq \\left( \\sum_{k=1}^n a_k^2 \\right) \\left( \\sum_{k=1}^n b_k^2 \\right)$\n",
    "\"\"\", styles={'font-size': '24pt'})\n",
    "\n",
    "cross_product = pn.pane.LaTeX(object=r\"\"\"\n",
    "$\\mathbf{V}_1 \\times \\mathbf{V}_2 =  \\begin{vmatrix}\n",
    "\\mathbf{i} & \\mathbf{j} & \\mathbf{k} \\\\\n",
    "\\frac{\\partial X}{\\partial u} &  \\frac{\\partial Y}{\\partial u} & 0 \\\\\n",
    "\\frac{\\partial X}{\\partial v} &  \\frac{\\partial Y}{\\partial v} & 0\n",
    "\\end{vmatrix}\n",
    "$\"\"\", styles={'font-size': '24pt'})\n",
    "\n",
    "spacer = pn.Spacer(width=50)\n",
    "\n",
    "pn.Column(\n",
    "    pn.pane.Markdown('# The LaTeX Pane'),\n",
    "    pn.Row(maxwell, spacer, cross_product, spacer, cauchy_schwarz)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sympy\n",
    "\n",
    "Panels LaTeX pane can render Sympy expressions as shown below:\n",
    "\n",
    "```python\n",
    "import sympy as sp\n",
    "import panel as pn\n",
    "\n",
    "pn.extension(\"mathjax\")\n",
    "\n",
    "# Define a symbol and a symbolic expression using SymPy\n",
    "x = sp.symbols('x')\n",
    "expression = sp.integrate(sp.sin(x)**2, x)\n",
    "\n",
    "# Create a LaTeX pane to display the expression\n",
    "latex_pane = pn.pane.LaTeX(expression, styles={'font-size': '20px'})\n",
    "\n",
    "# Serve the panel\n",
    "pn.Column(\n",
    "    \"# A sympy expression rendered in Panel: \", latex_pane\n",
    ")\n",
    "```\n",
    "\n",
    "![Sympy in LaTeX pane](../../assets/panel-sympy.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Controls\n",
    "\n",
    "The `LaTeX` pane exposes a number of options which can be changed from both Python and Javascript. Try out the effect of these parameters interactively:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pn.Row(latex.controls(jslink=True), latex)"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python",
   "pygments_lexer": "ipython3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
